package com.wangzhen.rxjava;

import rx.*;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;

import java.io.File;

/**
 * 演示
 * 1、创建观察者的两种方式；
 *  Observer observer = new Observer();
 *  Subscriber subscriber = new Subscriber();
 *  两种方式的区别在于，Subscriber比Observer多了一个onStart和unsubscrible方法
 * 2、创建被观察者的三种方式：
 *  Observable.create
 *  Observable.just
 *  Observable.from
 * 3、可以给创建事件的代码块以及消费事件的代码块分别指定不同的线程
 *  Observable.from(words).subscribeOn(Schedulers.io()) //指定产生事件所在的线程
 *                      .observeOn(Schedulers.io())     // 指定消费事件所在的线程
 *
 */
public class RxJavaApiDemo {

    public static void main(String[] args) {
        // 演示创建【观察者】的两种方法 之 第一种方法 Observer
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onCompleted() {
                System.out.println("complated");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("erroring! ");
            }

            @Override
            public void onNext(String s) {
                System.out.println("next");
            }
        };

        // 演示创建【观察者】的两种方法 之 第二种方法 Subscriber
        Subscriber<String> subscriber = new Subscriber<String>() {
            @Override
            public void onCompleted() {
            }

            @Override
            public void onError(Throwable e) {
            }

            @Override
            public void onNext(String s) {
            }
        };
        /* 通过Observer和Subscriber这两种方式创建出来的观察者，作用是等价的！
        * 只是Subscriber多了一个onStart和unsubscrible方法
        */

        // 演示创建【Observable-被观察者】的三种方法之第一种，create方法
        Observable<String> create = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("hello");
                subscriber.onNext("world");
                subscriber.onNext("china");
                subscriber.onCompleted();
            }
        });
        // 演示创建【Observable-被观察者】的三种方法之第二种，just方法
        Observable<String> just = Observable.just("hello", "world", "china");

        // 演示创建【Observable-被观察者】的三种方法之第三种，from方法
        String[] words = {"hello", "world", "china"};
        Observable<String> from = Observable.from(words);

        /* Observable#create方法和just/from方法的作用都是一样的
         * 都将会依次调用
         * onNext("hello");
         * onNext("world");
         * onNext("china");*/

        // 【订阅】将观察者和被观察者关联起来
        create.subscribe(observer);
        create.subscribe(subscriber);

        Subscription subscribe = Observable.from(new String[]{"hello", "world"}).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                System.out.println(s);
            }
        });

        Observable.from(words).subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                System.out.println("---->s");
            }
        });
    }
}
